package com.ray.tool.thread;



import com.ray.tool.RayStringTools;

import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 创建新的线程 - 工厂类
 *
 * @author LiaoYuXing-Ray
 * @version 1.0
 * @createDate 2023/8/31 9:15
 **/
public class RayThreadFactory implements ThreadFactory {
    /**
     * 生成线程池的编号 2023/10/7 11:46
     */
    private static final AtomicInteger poolNumber = new AtomicInteger(1);
    /**
     * 表示新创建的线程所属的线程组。如果系统安全管理器（SecurityManager）存在，则使用其管理的线程组；否则，使用当前线程的线程组 2023/10/7 11:46
     */
    private final ThreadGroup group;
    /**
     * 生成每个新线程的编号 2023/10/7 11:46
     */
    private final AtomicInteger threadNumber = new AtomicInteger(1);
    /**
     * 给每个新线程命名的前缀 2023/10/7 11:47
     */
    private final String namePrefix;

    RayThreadFactory(String prefix) {
        // 首先获取系统安全管理器
        SecurityManager s = System.getSecurityManager();
        // 是否存在安全管理器来确定线程组
        this.group = s != null ? s.getThreadGroup() : Thread.currentThread().getThreadGroup();
        /*
         * 如果传入的前缀不为空，则将其设置为`namePrefix`；否则，将`namePrefix`设置为一个默认的格式字符串，包含线程池编号和后台任务线程编号 2023/10/7 11:48
         */
        if (RayStringTools.isNotBlank(prefix)) {
            this.namePrefix = prefix;
        } else {
            this.namePrefix = String.format("线程池-%d-后台任务线程#-", poolNumber.getAndIncrement());
        }
    }

    /**
     * 创建线程
     *
     * @param runnable {@link Runnable}
     * @return java.lang.Thread {@link Thread}
     * @author LiaoYuXing-Ray 2023/10/7 11:49
     **/
    @Override
    public Thread newThread(Runnable runnable) {
        Thread thread = new Thread(this.group, runnable, this.namePrefix + this.threadNumber.getAndIncrement(), 0L);
        // 检查新创建的线程是否为守护线程，如果是，则将其设置为非守护线程
        if (thread.isDaemon()) {
            thread.setDaemon(false);
        }
        // 检查新创建的线程的优先级是否为5，如果不是，则将其设置为5
        if (thread.getPriority() != 5) {
            thread.setPriority(5);
        }
        return thread;
    }
}
